#include<bits/stdc++.h>
using namespace std;
int t,n,a[800005],c[800005],m,b[800005],d[16][400005],k,x[5],val[800005],names[800005],dep[800005],vval[800005];
char ch;
long long ans,vals[35],aans[800005];
inline long long getsum(int l,int r){
	return (l+r)*1ll*(r-l+1)/2;
}
inline void builds(int p,int l,int r,int mid){
	if(l==r){
		if(l<=mid) val[p]=a[l];
		else val[p]=0;
		vval[p]=l;
		dep[p]=0;
		return;
	}
//	cout<<p<<' '<<l<<' '<<r<<' '<<mid<<"@\n";
	names[2*p]=names[p]*2-1;
	builds(2*p,l,(l+r)>>1,mid);
	names[2*p+1]=names[p]*2;
	builds(2*p+1,((l+r)>>1)+1,r,mid);
	dep[p]=dep[2*p]+1;
//	cout<<p<<" "<<l<<' '<<r<<" "<<mid<<"#\n";
	if(val[2*p+d[dep[p]][names[p]]]>=dep[p]) val[p]=val[2*p+d[dep[p]][names[p]]],vval[p]=vval[2*p+d[dep[p]][names[p]]];
	else val[p]=val[2*p+1-d[dep[p]][names[p]]],vval[p]=vval[2*p+1-d[dep[p]][names[p]]];
//	cout<<p<<"ends\n";
}
inline void changes(int p,int l,int r,int q){
	if(l==r){
		val[p]=a[l];
		return;
	}
	if(q<=((l+r)>>1)) changes(2*p,l,(l+r)>>1,q);
	else changes(2*p+1,((l+r)>>1)+1,r,q);
	if(val[2*p+d[dep[p]][names[p]]]>=dep[p]) val[p]=val[2*p+d[dep[p]][names[p]]],vval[p]=vval[2*p+d[dep[p]][names[p]]];
	else val[p]=val[2*p+1-d[dep[p]][names[p]]],vval[p]=vval[2*p+1-d[dep[p]][names[p]]];
}
inline void ads(int p,long long q){
	if(p<=18) vals[p]+=q;
	else vals[19]+=q;
}
inline void clears(int p){
	for(int i=0;i<p;i++) vals[i]=0;
}
inline bool emp(){
	long long cnt=0;
	for(int i=0;i<=20;i++) cnt+=vals[i];
	return (cnt==0);
}
inline void gets(int p,int l,int r,int q){
	if(l==r){
		ads(a[l],l);
//		for(int i=0;i<=20;i++) cout<<vals[i]<<"-";
//		cout<<p<<"|\n";
		return;
	}
//	cout<<p<<' '<<l<<" "<<r<<" "<<q<<"\n";
	int mid=(l+r)>>1;
	if(q<=mid){
		gets(2*p,l,mid,q);
		if(d[dep[p]][names[p]]==0){
			clears(dep[p]);
			if(vals[20]!=0 || emp()) vals[20]+=getsum(mid+1,r);
		}else{
			vals[20]+=getsum(mid+1,r);
		}
	}else{
		gets(2*p+1,mid+1,r,q);
		if(d[dep[p]][names[p]]==1){
			clears(dep[p]);
			if(vals[20]!=0 || emp()) ads(val[2*p],vval[2*p]);
		}else{
			if(val[2*p]>=dep[p]){
				clears(21);
				ads(val[2*p],vval[2*p]);
			}else{
				
			}
		}
	}
//	for(int i=0;i<=20;i++) cout<<vals[i]<<"-";
//	cout<<p<<' '<<val[2*p]<<"|\n";
}
inline void solves(int l,int r){
	int mid=r/2;
	names[1]=1;
	builds(1,l,r,mid);
//	cout<<4<<"$";
	for(int i=mid+1;i<=r;i++){
//		cout<<i<<"^\n";
		for(int j=0;j<=20;j++) vals[j]=0;
//		cout<<i<<"*";
		gets(1,l,r,i);
//		cout<<i<<"()";
		aans[i]=0;
		for(int j=0;j<=20;j++) aans[i]+=vals[j];
//		cout<<i<<"="<<aans[i]<<"##\n";
		changes(1,l,r,i);
	}
}
inline void solve(){
	aans[1]=1;
//	for(int i=1;i<=n;i++){
//		cout<<a[i]<<' ';
//	}
//	cout<<"\n";
	for(int i=1;i<=k;i++){
//		cout<<i<<'|';
		solves(1,(1<<i));
//		cout<<i<<'^';
	}
	for(int i=1;i<=m;i++){
		ans^=(i*1ll*aans[c[i]]);
	}
//	for(int i=2;i<=n;i*=2) cout<<aans[i]<<'=';
}
int main(){
	freopen("arena.in","r",stdin);
	freopen("arena.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	for(int i=1;i<=m;i++){
		cin>>c[i];
	}
	while((1<<k)<n) k++;
	for(int i=1;i<=k;i++){
		for(int j=1;j<=(1<<(k-i));j++){
			cin>>ch;
			d[i][j]=ch-'0';
		}
	}
	cin>>t;
	while(t--){
		cin>>x[0]>>x[1]>>x[2]>>x[3];
//		cout<<x[0]<<" "<<x[1]<<' '<<x[2]<<' '<<x[3]<<"(\n";
		ans=0;
		for(int i=1;i<=n;i++) a[i]=b[i]^(x[i&3]);
		solve();
		cout<<ans<<"\n";
	}
	return 0;
}

